#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"

/*AT命令
"//vendor\hisi\hi3861\hi3861\components\at\src",
*/
#include <at.h>
#include <hi_at.h>

/*
2021年02月14日
作者:hcl0317
链接：
实现功能：
通过AT命令，实现红色LED打开和关闭

主要功能点:
1. GPIO 输出 -> LED灯
2. 实现AT命令相关的函数
3. 注册AT命令
*/

#define RED_LED_GPIO WIFI_IOT_IO_NAME_GPIO_10

//1.任务处理函数
static void* AT_CMD_Test_Task(const char* arg)
{
    (void)arg;
    printf("AT_CMD_Test_Task()\n");

    GpioInit();//使用GPIO，都需要调用该接口

    //红黄绿灯扩展板上，对应的LED GPIO10,11,12初始化
    printf("LED GPIO init...\r\n");
	//复用引脚为 GPIO 红色LED为管脚 WIFI_IOT_IO_NAME_GPIO_10
    IoSetFunc(RED_LED_GPIO, 0);
    //设置为输出
    GpioSetDir(RED_LED_GPIO, WIFI_IOT_GPIO_DIR_OUT);

    while(1)
    {
        usleep(100000);
    }

    return NULL;
}


//AT命令参数
hi_char g_at_cmd_led_buf[10] = "OFF";

/*
AT命令，参考 Hi3861V100／Hi3861LV100 AT命令 使用指南.pdf

测试指令 AT+<cmd>=? 该命令用于查询设置指令的参数以及取值范围。
查询指令 AT+<cmd>? 该命令用于返回参数的当前值。
设置指令 AT+<cmd>=<parameter>,…设置参数值或执行。
执行指令 AT+<cmd> 用于执行本指令的功能。

设计命令 AT+LED

AT+LED=ON
AT+LED=OFF

1. 编写AT命令相关的函数
2. 初始化AT命令列表
3. 注册AT命令

下面是一个AT命令的示例
*/

/*1.1.测试指令*/
hi_u32 at_cmd_led_test(hi_s32 argc, const hi_char *argv[])
{
	argc = argc;
	argv = argv;
	hi_at_printf("%s or %s\r\n", "ON","OFF");//参数为 ON OFF
    return HI_ERR_SUCCESS;
}



/*1.2.查询指令*/
hi_u32 at_cmd_led_query(hi_s32 argc, const hi_char *argv[])
{
	argc = argc;
	argv = argv;
	hi_at_printf("%s\r\n", g_at_cmd_led_buf);//打印当前参数
    return HI_ERR_SUCCESS;
}

/*1.3.设置指令*/
hi_u32 at_cmd_led_set(hi_s32 argc, const hi_char *argv[])
{
	/*hi_s32 ui = 0;
	hi_at_printf("at_cmd_mytest_set\r\n");
	hi_at_printf("argc=%d\r\n", argc);
	for(ui = 0; ui < argc; ui++)
	{
		hi_at_printf("%s\r\n", argv[ui]);
	}

	if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
        return HI_ERR_FAILURE;
    }
	*/
	
	//检查参数个数是否正确
	if(argc != 1)
	{
		hi_at_printf("param error\r\n");
		return HI_ERR_FAILURE;
	}
	
	//检查参数是否为空
	if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) 
	{
        return HI_ERR_FAILURE;
	}
	
	if(0 == strcmp("ON",argv[0]) ||
		0 == strcmp("OFF",argv[0]))
	{
		strcpy(g_at_cmd_led_buf,argv[0]);
	}
	else
	{
		hi_at_printf("param error\r\n");
		return HI_ERR_FAILURE;
	}

    return HI_ERR_SUCCESS;
}


/*1.4.执行指令*/
hi_u32 at_cmd_led_exe(hi_s32 argc, const hi_char *argv[])
{
	argc = argc;
	argv = argv;

	if(0 == strcmp("ON",g_at_cmd_led_buf))
	{
		GpioSetOutputVal(RED_LED_GPIO,WIFI_IOT_GPIO_VALUE1);//高电平，点亮灯
	}

	if(0 == strcmp("OFF",g_at_cmd_led_buf))
	{
		GpioSetOutputVal(RED_LED_GPIO,WIFI_IOT_GPIO_VALUE0);//关闭灯
	}

    return HI_ERR_SUCCESS;
}

/*1.3.设置指令*/
hi_u32 at_cmd_mytest_set(hi_s32 argc, const hi_char *argv[])
{
	hi_s32 ui = 0;
	if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
        return HI_ERR_FAILURE;
    }
    hi_at_printf("at_cmd_mytest_set\r\n");
	hi_at_printf("argc=%d\r\n", argc);
	for(ui = 0; ui < argc; ui++)
	{
		hi_at_printf("%s\r\n", argv[ui]);
	}
    return HI_ERR_SUCCESS;
}

/*1.4.执行指令*/
hi_u32 at_cmd_mytest_exe(hi_s32 argc, const hi_char *argv[])
{
	hi_s32 ui = 0;
	if (at_param_null_check(argc, argv) == HI_ERR_FAILURE) {
        return HI_ERR_FAILURE;
    }
    hi_at_printf("at_cmd_mytest_exe\r\n");
	hi_at_printf("argc=%d\r\n", argc);
	for(ui = 0; ui < argc; ui++)
	{
		hi_at_printf("%s\r\n", argv[ui]);
	}
    return HI_ERR_SUCCESS;
}

//2. AT命令列表
const at_cmd_func g_at_edp_func_tbl[] = {
    {"+MYTEST", 7, HI_NULL, HI_NULL, (at_call_back_func)at_cmd_mytest_set, (at_call_back_func)at_cmd_mytest_exe},
    {"+LED", 4, (at_call_back_func)at_cmd_led_test, (at_call_back_func)at_cmd_led_query, (at_call_back_func)at_cmd_led_set, (at_call_back_func)at_cmd_led_exe},
};


//2.任务入口函数
static void HelloWorld_Entry(void)
{
    osThreadAttr_t attr = {0};

    printf("HelloWorld_Entry()\n");

    attr.name = "HelloWorld_Entry";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;//堆栈大小
    attr.priority = osPriorityNormal;//优先级

	//3. 注册AT指令
    hi_at_register_cmd(g_at_edp_func_tbl, sizeof(g_at_edp_func_tbl)/sizeof(g_at_edp_func_tbl[0]));

    if (osThreadNew((osThreadFunc_t)AT_CMD_Test_Task, NULL, &attr) == NULL)
    {
        printf("[HelloWorld] Falied to create LedTask!\n");
    }
}



//3.注册模块
SYS_RUN(HelloWorld_Entry);
